package org.Yiran.timetale_re.menu.slot;

import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.SlotItemHandler;
import org.Yiran.timetale_re.item.items.RuneBlueprintBookItem;
import org.jetbrains.annotations.NotNull;

/**
 * 符文图纸专用槽位类
 * <p>
 * 该类继承自SlotItemHandler，专门用于处理符文图纸物品的槽位。
 * 限制只能放置符文图纸类型的物品，并且每个槽位只能放置一个物品。
 * 主要用于GUI界面中需要限制物品类型的特殊槽位。
 * </p>
 */
public class RuneBlueprintOnlySlot extends SlotItemHandler {
    
    // ==============================
    // 构造方法
    // ==============================

    /**
     * 构造函数，创建一个只允许放置符文图纸的槽位
     * <p>
     * 初始化符文图纸专用槽位，设置其关联的物品处理器、索引和GUI位置。
     * </p>
     *
     * @param itemHandler 物品处理器，用于管理槽位中的物品
     * @param index       槽位索引，在物品处理器中的位置
     * @param xPosition   槽位在GUI界面中的X坐标
     * @param yPosition   槽位在GUI界面中的Y坐标
     */
    public RuneBlueprintOnlySlot(IItemHandler itemHandler, int index, int xPosition, int yPosition) {
        super(itemHandler, index, xPosition, yPosition);
    }

    // ==============================
    // 物品放置验证方法
    // ==============================

    /**
     * 检查指定物品是否可以放置在此槽位中
     * <p>
     * 重写父类方法，限制只能放置符文图纸类型的物品。
     * 通过RuneBlueprintBookItem.isRuneBlueprint方法验证物品是否为符文图纸。
     * </p>
     *
     * @param stack 要检查的物品堆
     * @return 如果物品是符文图纸则返回true，否则返回false
     */
    @Override
    public boolean mayPlace(@NotNull ItemStack stack) {
        return RuneBlueprintBookItem.isRuneBlueprint(stack);
    }

    // ==============================
    // 堆叠数量限制方法
    // ==============================

    /**
     * 获取此槽位的最大堆叠数量
     * <p>
     * 重写父类方法，限制每个槽位只能放置一个物品。
     * </p>
     *
     * @return 最大堆叠数量(1)
     */
    @Override
    public int getMaxStackSize() {
        return 1;
    }

    /**
     * 获取指定物品在此槽位中的最大堆叠数量
     * <p>
     * 重写父类方法，无论传入什么物品，都限制每个槽位只能放置一个物品。
     * </p>
     *
     * @param stack 物品堆栈
     * @return 最大堆叠数量(1)
     */
    @Override
    public int getMaxStackSize(@NotNull ItemStack stack) {
        return 1;
    }

    // ==============================
    // 物品取放处理方法
    // ==============================

    /**
     * 当玩家从槽位中取走物品时的处理方法
     * <p>
     * 重写父类方法，确保只取走一个物品，即使原堆叠中有多个。
     * </p>
     *
     * @param player 玩家对象
     * @param stack  被取走的物品堆
     */
    @Override
    public void onTake(@NotNull Player player, @NotNull ItemStack stack) {
        // 确保只取走一个物品，即使原堆叠中有多个
        super.onTake(player, stack);
    }

    /**
     * 快速移动时的堆叠逻辑处理方法
     * <p>
     * 重写父类方法，处理快速移动时的堆叠逻辑。
     * </p>
     *
     * @param stack  物品堆栈
     * @param amount 移动的数量
     */
    @Override
    protected void onQuickCraft(@NotNull ItemStack stack, int amount) {
        // 处理快速移动时的堆叠逻辑
        super.onQuickCraft(stack, amount);
    }

    /**
     * 检查成就获取的处理方法
     * <p>
     * 重写父类方法，确保成就检查时只计算实际移动的数量。
     * </p>
     *
     * @param stack 物品堆栈
     */
    @Override
    protected void checkTakeAchievements(@NotNull ItemStack stack) {
        // 确保成就检查时只计算实际移动的数量
        super.checkTakeAchievements(stack);
    }
}